home *** CD-ROM | disk | FTP | other *** search
/ PC Elektro 3 / PC-Elektro-3-cd1.bin / KBan 2.0 / KBANSRC.LZH / SRC / PROG / CMD / STPULL.CPP < prev    next >
Encoding:
C/C++ Source or Header  |  1997-10-07  |  3.1 KB  |  121 lines

  1. /*
  2.  * the class STAGE_PULL_CORE
  3.  * Copyright (C) 1996, 1997 Kazutaka Hirata <khirata@jove.acs.unt.edu>
  4.  */
  5.  
  6. #include "../stdafx.h"
  7.  
  8. #include "stpull.h"
  9.  
  10. void STAGE_PULL_CORE::erase_selected_lines(KBAN_DRAW& draw, const LINE_P_LIST &target)
  11. {
  12.   LINE_P_LIST::iterator i;
  13.   TRAVERSE(target, i) {
  14.     const LINE_ELEMENT& current = *(i->ptr());
  15.     draw.erase_primitive_line(current);
  16.   }
  17. }
  18.  
  19. void STAGE_PULL_CORE::redraw_selected_lines(KBAN_DRAW& draw, const LINE_P_LIST &target)
  20. {
  21.   LINE_P_LIST::iterator i;
  22.   TRAVERSE(target, i) {
  23.     const LINE_ELEMENT& current = *(i->ptr());
  24.     draw.draw_primitive_line(current, m_old_active_layer);
  25.   }
  26. }
  27.  
  28. void STAGE_PULL_CORE::fix_pull_lines(KBAN_DRAW& draw, const XY &ac_dst)
  29. {
  30.   LINE_P_LIST::iterator i;
  31.   TRAVERSE(m_plist, i) {
  32.     LINE_ELEMENT& current = *(i->ptr());
  33.     if(current.ac_s() == m_ac_target) {
  34.       current.set_ac_s(ac_dst);
  35.       draw.draw_primitive_line(current, m_old_active_layer);
  36.     } else if(current.ac_e() == m_ac_target) {
  37.       current.set_ac_e(ac_dst);
  38.       draw.draw_primitive_line(current, m_old_active_layer);
  39.     }
  40.   }
  41. }
  42.  
  43. void STAGE_PULL_CORE::delete_no_length_lines(KBAN_INFO& info)
  44. {
  45.   PRIMITIVE& primitive = info.kban_data().primitive();
  46.   LINE_LIST& line_list = primitive.layer(info.active_layer().get()).line_list();
  47.   LINE_LIST::iterator i;
  48.   TRAVERSE(line_list, i) {
  49.     LINE_ELEMENT& current = *i;
  50.     if(current.ac_s() == current.ac_e()) {
  51.       LINE_LIST::iterator current_i = i--;
  52.       line_list.erase(current_i);
  53.     }
  54.   }
  55. }
  56.  
  57. STAGE_PULL_CORE::STAGE_PULL_CORE(const XY &ac, uint layer, const LINE_P_LIST& list)
  58.   : m_plist(list),
  59.     m_ac_target(ac),
  60.     m_old_active_layer(layer),
  61.     m_mcur(ac, layer, m_plist)
  62. {
  63. }
  64.  
  65. STAGE* STAGE_PULL_CORE::init(KBAN_INFO& info, KBAN_DRAW& draw)
  66. {
  67.   info.bCaptured() = true;
  68.   erase_selected_lines(draw, m_plist);
  69.   m_mcur.redraw_cursor(draw);
  70.   return this;
  71. }
  72.  
  73. STAGE* STAGE_PULL_CORE::redraw(KBAN_INFO& info, KBAN_DRAW& draw)
  74. {
  75.   erase_selected_lines(draw, m_plist);
  76.   m_mcur.redraw_cursor(draw);
  77.   return this;
  78. }
  79.  
  80. STAGE* STAGE_PULL_CORE::mouse_move(KBAN_INFO& info, KBAN_DRAW& draw, const XY& pc, UINT nFlags)
  81. {
  82.   XY ac;
  83.   info.grid().xy_pc2ac(pc, ac);
  84.   m_mcur.draw_cursor(draw, ac);
  85.   return this;
  86. }
  87.  
  88. // This function is to be overridden but still needs to be called.
  89.  
  90. STAGE* STAGE_PULL_CORE::mouse_left_up(KBAN_INFO& info, KBAN_DRAW& draw, const XY& pc, UINT nFlags)
  91. {
  92.   m_mcur.erase_cursor(draw);
  93.   XY ac;
  94.   info.grid().xy_pc2ac(pc, ac);
  95.  
  96.   fix_pull_lines(draw, ac);
  97.   delete_no_length_lines(info);
  98.   info.SetModifiedFlag();
  99.   info.new_state().set(true);
  100.   info.new_state_str() = "Pull";
  101.  
  102.   m_done.set(TRUE);
  103.   return NULL;
  104. }
  105.  
  106. // This function is to be overridden but still needs to be called.
  107.  
  108. STAGE* STAGE_PULL_CORE::mouse_right_up(KBAN_INFO& info, KBAN_DRAW& draw, const XY& pc, UINT nFlags)
  109. {
  110.   return NULL;
  111. }
  112.  
  113. void STAGE_PULL_CORE::end(KBAN_INFO& info, KBAN_DRAW& draw)
  114. {
  115.   info.bCaptured() = false;
  116.   if(!m_done.get()) {
  117.     m_mcur.erase_cursor(draw);
  118.     redraw_selected_lines(draw, m_plist);
  119.   }
  120. }
  121.